/**
 * 需要对密码进行加密，用的是bcryptjs模块
 */
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')

const db = require('../db/index')
const config = require('../config/config')


// 用户注册
exports.register_user = (req, res) => {
    // 1. 获取前端传来的数据
    const user = req.body

    // 2. 校验数据的合法性，使用express-jio中间件和jio模块自定义检验方法（jio自定义方法在schema模块中）
    // const reg = /[0-9a-zA-Z_]{5,10}/
    // if(!reg.test(user.username) || !reg.test(user.password)) return res.cc('用户名或密码不合法')
    
    // 对密码进行加密
    user.password = bcrypt.hashSync(user.password, 10)

    // 3. 查询用户是否已经注册
    const select_sql = `SELECT * FROM USERS WHERE username=?`
    db.query(select_sql, [user.username], (err, results) => {
        // 数据库错误
        if(err) return res.cc('数据库错误')

        // 当前用户名已被注册
        if(results.length >= 1) return res.cc('该用户已注册')

        // 用户名可用，将注册数据写入数据库然后响应结果
        // console.log('password:', user.password)
        const insert_sql = `INSERT INTO USERS set ?`
        db.query(insert_sql, user, (err, results) => {
            // 注册失败
            // console.log('err', err)
            if(err) return res.cc('注册失败，请重试')
            // 注册成功
            if(results.affectedRows === 1){
                res.send({
                    status: 0,
                    msg: '恭喜你，注册成功'
                })
            }
        })
    })

    // 4. 返回结果
}


// 用户登录
exports.login_user = (req, res) =>{
    // 1. 校验参数
    const user = req.body
    // console.log('username:', user.username)

    // 2. 和数据库中用户的信息进行匹配
    const select_sql = 'SELECT password FROM USERS WHERE username=?'
    db.query(select_sql, user.username, (err, results) => {
        if(err) return res.cc('数据库发生错误')

        // console.log('results:', results)
        // console.log('user:', user)

        // throw new Error('服务器发生错误...')

        const compareResult = bcrypt.compareSync(user.password, results[0].password)
        if(!compareResult) return res.cc('密码错误')

        // 3. 构建jwttoken
        const jwtToken = jwt.sign({username: user.username}, config.secretKey, {expiresIn: '10h'})

        // 4. 将响应返回给客户端
        res.send({
            status: 0,
            msg: '登陆成功',
            token: jwtToken
        })

    })
    
}
